热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

水位|下游_Flink总结

本文由编程笔记#小编为大家整理,主要介绍了Flink总结相关的知识,希望对你有一定的参考价值。Flink总结一、初步
本文由编程笔记#小编为大家整理,主要介绍了Flink总结相关的知识,希望对你有一定的参考价值。



Flink总结




一、初步了解什么是Flink?



Flink是一个实时的流式计算引擎,与sparkStreaming不同的是底层是流式引擎,并且有用事件窗口和时间窗口两种窗口,可以进行离线和实时计算,有着完美的容错机制,以及数据延迟机制,在支持高吞吐的同时保证低延迟,并提出了时间语义的概念,将数据分为有界流和无界流,且拥有FlinkSQL方便操作与学习成本。



1、Flink的编程模型


Flink API分层


  • 1、Stateful Stream Processing:是Flink最底层的接口,提供了对时间和状态的细粒度控制,虽然灵活度高,但学习成本高,要求编码能力高
  • 2、DataStream DataSet API:提供了一些封装好的算子,方便使用计算处理分为两种,流式-DataStream API 和 DataSet API 批处理
  • 3、SQL& Table API : 通过构建Table环境,将数据注册成表,直接通过SQL进行编写即可
  • 4、扩展库:复杂事件处理CEP,Gelly做图计算的,是一个可扩展的图形处理和分析库。





Flink 组成:数据源+数据转换+数据输出
Data Source + Transformations + Data Sink
Flink程序整体的流程可以由多个数据源或者多个输出Slink,中间会经过多个算子进行数据的过滤,形成一个有向无环图DAG





2、Flink的算子Operator


Spark的算子分为:控制算子,行动算子,转换算子。Flink算子划分如下;


  • ① 基本转换算子:map()/filter()/flatmap()
  • ② 键控流转换算子:keyby()/滚动聚合算子(sum/min/max/minBy)/reduce(x+x)
  • ③ 多流转换算子:union():对多条数据合并输出要求数据类型相同不去重。connect():对两条不同的数据流进行合并
  • ④ 分布式算子:Random():将上游数据随机分发给下游。Rescale():将上游数据平分到下游。Rebalance():将上游数据依次分发到下游。Global:将上游数据每一份分发到下游第一个分区。Broadcast():将上游数据所有数据复制发送到下游算子的任务中。


3、富函数


富函数:每个函数处理数据之前都需要进行初始化工作,以及数据处理的事后清理,每个DataStream API提供的所有转换算子都由其富函数版本:
常用函数:RichMapFunction、RichFlatMapFunction、RichFilterFunction
富函数主要提供了额外方法:


  • open():即初始化方法,通常用来只需要一次的初始化工作
  • close():做最后的清理工作
  • getRuntimeContext():提供了函数的一些信息,并行度,子任务等以及分区状态的方法




二、Flink集群架构


1、角色分配以及流程



流程:
由App发送任务给分发器Dispatcher,再由分发器对任务进行分发,提交给JobManager,JobManager负责本次任务,JM向ResourceManager资源管理者申请资源,RM会将每个集群的资源情况获取到,并分配给JM资源,再由JM将任务分发给子节点上的TaskManager进行执行,TM开始完成任务。





2、TaskSlot与Parallelism


TaskSlot:任务槽,即用于完成任务所用的资源,会根据任务的并行度进行申请资源
Parallelism:并行度,分为算子并行度,环境并行度,客户端并行度,系统并行度
Flink的执行图分层:


  • StreamGraph:根据用户的Stream API编写的代码生成拓扑结构图
  • Job Graph:将多个符合条件的节点chain在一起作为一个节点减少节点之间的IO传输消耗,以及序列化和反序列化、(形成一个操作链)
  • ExecutionGraph:即调度层,最核心的地方由Job Graph的基础上生成
  • 物理执行图:通过具体的组件算子进行计算。




3、Flink的并行度


  • 算子级别:setParallelism()方法定义并行度
  • 执行环境级别:创建环境后.setParallelism()方法
  • 客户端级别:即使用客户端提交任务时指定-p参数来设置并行度
  • 系统级别:通过修改flink的parallelism.default文件来设置并行度




4、窗口机制


首先窗口概念:通过对数据基于时间或者时间的划分,进行计算,便是窗口。
窗口分类:


  • 滑动窗口:滑动窗口在规定时间内进行滑动,会出现重复数据计算
  • 滚动窗口:滚动窗口通过规定时间划分窗口,不会出现重复数据计算
  • 会话窗口:会话窗口不会重叠,没有固定的开始和结束,当窗口一段时间没有接收到数据,则会关闭窗口
  • 全局窗口:将所有相同key的数据分配到单个窗口中计算结果

窗口功能分类:


  • 时间窗口:即设置窗口一次处理多长时间数据,后者窗口滑动、滚动的时间,
  • 事件窗口:即基于事件,一个窗口处理几条事件作为窗口的划分

窗口函数分类:


  • 增量函数:增量指在之前的上个窗口结果的基础上进行当前数据的计算
  • 全量函数:全量指不仅将当前的数据进行计算还有加上历史数据整体进行计算

详解水位线原理—>点击跳转


  • 水位线注意点:单个线程(单数据源)的时候每次获取当前事务中最大的事务时间减去延迟时间来获取水位线,而并发情况下的水位线会获取到最小的水位线向下游广播同步,也是对齐机制。




5、水位线之后迟到的数据怎么办?


现实中很难有一个很完美的水位线将所有的延迟数据都进行挽回,水位线不仅要考虑效率,还要考虑将数据丢失概率降低,从整体的性价比来考量,故此Flink提供了一些机制进行弥补:


  • 直接将延迟数据丢弃
  • 将迟到的数据输出到单独的数据流中&#xff0c;即使用sideOutputLateData(new OutputTag<>())实现测输出
  • 根据迟到的事件更新并发处结果




三、Flink的状态



数据流被分为有状态和无状态&#xff0c;Flink中的算子与状态关联&#xff0c;所有Flink的计算是有状态的&#xff0c;算子会在计算时将自己的状态注册到TaskManager中。
状态分类&#xff1a;
算子状态、键控状态





1、Flink容错机制

容错机制详解—>跳转




2、State Backends & SavePoint


Flink在保存状态时&#xff0c;支持三种存储方式&#xff0c;如下&#xff1a;


  • MemoryStateBackend (基于内存存储)
  • FsStateBackend (基于文件系统存储)
  • RocksDBStateBackend (基于RocksDB数据库存储)





Savepoint&#xff1a;保存点与CheckPoint类似&#xff0c;一个时系统提供的&#xff0c;一个是用户自己定义&#xff0c;一般由用户进行手动的备份和恢复。





3、Flink流处理的三种语义


at most once : 至多一次&#xff0c;表示一条消息不管后续处理成功与否只会被消费处理一次&#xff0c;那么就存在数据丢失可能。
exactly once : 精确一次&#xff0c;表示一条消息从其消费到后续的处理成功&#xff0c;只会发生一次。
at least once &#xff1a;至少一次&#xff0c;表示一条消息从消费到后续的处理成功&#xff0c;可能会发生多次。





4、Flink之CEP概念


CEP 由一个或者多个规则组成&#xff0c;主要目的就是从有序简单的数据中获取到高阶特征&#xff0c;简单说就是通过数据的表面看数据本质&#xff0c;CEP可以理解为一个数据模型&#xff0c;数据经过CEP模型来获取一定的指标或者数据。&#xff08;Pattern API &#xff09;
CEP模式分类&#xff1a;


  • 单个模式&#xff1a;单个模式就是只接受一个事件
  • 循环模式&#xff1a;可以接受多个事件
  • 组合模式&#xff1a;① 严格连续 ② 松散连续 ③ 不确定的松散连续
  • 匹配后跳过策略&#xff1a;对于一个给定的模式&#xff0c;防止同一个事件可能会分配到多个成功的匹配上。




5、Flink 数据反压


Flink1.5版本之前的反压机制

首先由TaskA 发送数据至TaskB,在TaskA的速率远远大于TaskB时&#xff0c;一定会出现反压情况&#xff0c;首先是TaskB的InputChannel会被填满&#xff0c;此时会向LocalBuffer申请空间&#xff0c;当LocalBuffer也填满后&#xff0c;再向NetworkBuffer申请空间&#xff0c;最后NetworkBuffer没空间后&#xff0c;堆积到Socket&#xff0c;Socket堆满会给发送端发送一个状态&#xff0c;此时发送端停止给Socket发送&#xff0c;TaskA这边的Netty发现Socket满了之后会使用Buffer&#xff0c;最后全部全部缓存用尽&#xff0c;TaskA也停止发数据&#xff0c;实现反压。
缺点&#xff1a;


  • 过于依赖TCP传输&#xff0c;并且反压延迟过高





1.5版本之后

如图TaskA正常向TaskB发送数据&#xff0c;单每次ResultSubPartition向InputChannel发送消息的时候都会发送一个Backlog size告诉下游准备发送多少数据&#xff0c;下游会告诉上游是否还有足够空间Buffer&#xff0c;当没有足够的空间时则不进行发送。主要降低了反压生效的延迟性&#xff0c;同时Socket不会阻塞。





推荐阅读
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 使用方法:将要控制的角色拖到TargetBody,将相机的焦点拖到CamerPivot,,建议CameraPivot是一个放在TargetBody下的子物体,并且位置应该是在Tar ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Windows 11系统中Win键失效的解决方法与专业建议
    Windows 11系统中Win键失效的解决方法与专业建议 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 在第二课中,我们将深入探讨Scala的面向对象编程核心概念及其在Spark源码中的应用。首先,通过详细的实战案例,全面解析Scala中的类和对象。作为一门纯面向对象的语言,Scala的类设计和对象使用是理解其面向对象特性的关键。此外,我们还将介绍如何通过阅读Spark源码来进一步巩固对这些概念的理解。这不仅有助于提升编程技能,还能为后续的高级应用开发打下坚实的基础。 ... [详细]
author-avatar
手机用户2702936061
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有